home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / loaders / Prince / princehd.asm < prev    next >
Assembly Source File  |  2000-04-12  |  8KB  |  511 lines

  1. ; *** Prince Hard Disk Loader V1.2
  2. ; *** Written by Jean-François Fabre
  3.  
  4.  
  5.     include    "jst.i"
  6.                 not a standard disk!
  7.                      |
  8.     HD_PARAMS    "Prince.d",509952,1
  9.  
  10. loader:
  11.     RELOC_MOVEL    D0,trainer    ; store trainer flag for later
  12.  
  13.     Mac_printf    "Prince Of Persia HD Loader V1.2"
  14.     Mac_printf    "Coded by Jean-François Fabre © 1997-1998"
  15.  
  16.     RELOC_TSTL    trainer
  17.     beq    skip$
  18.  
  19.     NEWLINE
  20.     Mac_printf    "Trainer activated: Infinite energy and time"
  21. skip$
  22.     bsr    LoadGameHD    ; try to read savegame buffer
  23.  
  24.     JSRABS    LoadDisks    ; read diskfile (unless LOWMEM is on)
  25.  
  26.     ; *** allocate external mem (optionnal in the game but compulsory in this loader)
  27.  
  28.     move.l    #$80000,D0
  29.     JSRABS    AllocExtMem
  30.     RELOC_MOVEL    D0,ExtBase
  31.     beq    MemErr
  32.  
  33.     bsr    checkversion    ; there are (at least) 3 different versions around
  34.  
  35.     moveq.l    #0,D0
  36.     move.l    #-1,D1
  37.     JSRABS    Degrade        ; no caches at all, goto PAL
  38.     
  39. ;    WAIT_LMB
  40.  
  41.     GO_SUPERVISOR        ; supervisor mode
  42.     SAVE_OSDATA    $80000    ; saves $0-$80000 chipmem
  43.     move    #$2700,SR    ; no interrupts
  44.     lea    $10000,A7    ; relocates stack
  45.  
  46.     ; **** boot stuff and patch
  47.  
  48.     bsr    installboot    ; installs bootprog
  49.     bsr    patchboot    ; patches bootprog
  50.  
  51.     JSRGEN    FlushCachesHard    ; cache flush
  52.     move.l    version(pc),D0    ; different versions -> different jumps
  53.     cmp.l    #2,D0
  54.     beq    v2$
  55.     jmp    $7E986        ; same for V1 and V3
  56. v2$
  57.     jmp    $7E988
  58.     nop
  59.     nop
  60.  
  61. PatchProg:
  62.     STORE_REGS
  63.  
  64.     ; *** removes protection level (common to both versions)
  65.  
  66.     move.l    #-1,$6378.W
  67.  
  68.  
  69.     move.l    version(pc),D0
  70.     cmp.l    #1,d0
  71.     bne    version2
  72.  
  73. version1:
  74.     ; *** removes unexpected exception
  75.  
  76.     move.w    #$6004,$195E8
  77.  
  78.     ; *** quit key
  79.  
  80.     PATCHUSRJSR    $1A322,kbint
  81.  
  82.     ; *** load/save
  83.  
  84.     PATCHUSRJMP    $C770,SaveGame_V1
  85.     PATCHUSRJMP    $C808,LoadGame_V1
  86.  
  87.     move.l    trainer(pc),D0    ; trainer ON?
  88.     beq    skipt$
  89.  
  90.     ; *** time--
  91.  
  92.     move.l    #$4E714E71,$1926A
  93.     move.w    #$4E71,$1926E
  94.  
  95.     ; *** time=15 (levelskip)
  96.  
  97.     move.b    #$60,$190D6
  98.  
  99.     ; *** infinite energy
  100.  
  101.     PATCHUSRJSR    $C622,Trainer_V1
  102.  
  103. skipt$
  104.  
  105.     JSRGEN    FlushCachesHard        ; cache flush!
  106.  
  107.     RESTORE_REGS
  108.     jmp    $1F662
  109.  
  110.  
  111. version2:
  112.     cmp.l    #2,d0
  113.     bne    version3
  114.  
  115.     ; *** removes unexpected exception
  116.  
  117.     move.w    #$6004,$195B6
  118.  
  119.     ; *** quit key
  120.  
  121.     PATCHUSRJSR    $1A2F0,kbint
  122.  
  123.     ; *** if exception exit
  124.  
  125. ;    PATCHUSRJMP    $7F38E,error
  126.  
  127.     ; *** load/save
  128.  
  129.     PATCHUSRJMP    $C774,SaveGame_V2
  130.     PATCHUSRJMP    $C806,LoadGame_V2
  131.  
  132.     ; *** trainer
  133.  
  134.     move.l    trainer(pc),D0
  135.     beq    skipt$
  136.  
  137.     ; *** time--
  138.  
  139.     move.l    #$4E714E71,$19238
  140.     move.w    #$4E71,$1923C
  141.  
  142.     ; *** time=15 (levelskip)
  143.  
  144.     move.w    #$703C,$190A6
  145.     move.w    #$703C,$1909C
  146.  
  147.     ; *** infinite energy
  148.  
  149.     PATCHUSRJSR    $C626,Trainer_V2
  150.  
  151. skipt$
  152.     JSRGEN    FlushCachesHard        ; cache flush!
  153.  
  154.     RESTORE_REGS
  155.     jmp    $1F636
  156.  
  157. version3:
  158.     ; *** removes unexpected exception
  159.  
  160.     move.w    #$6004,$195C0
  161.  
  162.     ; *** quit key
  163.  
  164.     PATCHUSRJSR    $1A2FA,kbint
  165.  
  166.     ; *** load/save
  167.  
  168.     PATCHUSRJMP    $C748,SaveGame_V3
  169.     PATCHUSRJMP    $C7E0,LoadGame_V3
  170.  
  171.     move.l    trainer(pc),D0
  172.     beq    skipt$
  173.  
  174.     ; *** time--
  175.  
  176.     move.l    #$4E714E71,$19242
  177.     move.w    #$4E71,$19246
  178.  
  179.     ; *** time=15 (levelskip)
  180.  
  181.     move.b    #$60,$190AE
  182.  
  183.     ; *** infinite energy
  184.  
  185.     PATCHUSRJSR    $C5FA,Trainer_V3
  186.  
  187. skipt$
  188.     
  189.     JSRGEN    FlushCachesHard        ; cache flush!
  190.  
  191.     RESTORE_REGS
  192.     jmp    $1F63A
  193.  
  194. error:
  195.     JSRGEN    WaitMouse
  196.     JSRGEN    InGameExit
  197.     bra    error
  198.  
  199. installboot:
  200.     lea    $7E800,A0
  201.     moveq.l    #0,D0
  202.     move.l    #$1800,D1
  203.     moveq.l    #0,D2
  204.     JSRGEN    ReadDiskPart    ; read first $1800 bytes of the disk
  205.     rts
  206.  
  207. patchboot:
  208.     move.l    version(pc),D0
  209.     cmp.l    #2,D0
  210.     beq    patchboot2
  211.  
  212.     ; same patches for boot in V1 and V3
  213.  
  214. patchboot1:
  215.     ; 512K expansion memory
  216.  
  217.     PATCHUSRJMP    $7EAA0,GetExtMem
  218.  
  219.     ; disk load
  220.  
  221.     PATCHUSRJMP    $7EE24,ReadTracks
  222.     move.l    #$4E714E71,$7EA2A
  223.     move.w    #$6006,$7E9E6
  224.  
  225.     ;    ** $7EE4C load
  226.  
  227.     move.w    #$6044,$7E8A6
  228.  
  229.     PATCHUSRJMP    $7EA2E,PatchProg
  230.     rts
  231.  
  232.  
  233. patchboot2:
  234.     PATCHUSRJMP    $7EAA4,GetExtMem
  235.     PATCHUSRJMP    $7EE28,ReadTracks
  236.     move.l    #$4E714E71,$7EA2C
  237.     move.w    #$6006,$7E9E8
  238.  
  239. ;    ** $7EE4C load
  240.  
  241.     move.w    #$6044,$7E8A8
  242.  
  243.     PATCHUSRJMP    $7EA30,PatchProg
  244.     rts
  245.  
  246.  
  247. kbint:
  248.     move.b    $BFEC01,D2
  249.     move.l    D2,-(sp)
  250.     not.b    D2
  251.     ror.b    #1,D2
  252.     cmp.b    #$59,D2        ; F10 pressed?
  253.     bne    noquit$
  254.     JSRGEN    InGameExit    ; clean quit to WB
  255. noquit$
  256.     move.l    (sp)+,D2
  257.     rts
  258.  
  259. Trainer_V1:
  260.     tst.l    D0
  261.     bne    nodie$
  262.     CLR.L    $47AD4
  263. nodie$
  264.     RTS
  265.  
  266.  
  267. Trainer_V2:
  268.     tst.l    D0
  269.     bne    nodie$
  270.     CLR.L    $479FC
  271. nodie$
  272.     RTS
  273.  
  274. Trainer_V3:
  275.     tst.l    D0
  276.     bne    nodie$
  277.     CLR.L    $47AAC
  278. nodie$
  279.     RTS
  280.  
  281. SaveGame_V3:
  282.     movem.l    D1-A6,-(sp)
  283.     lea    savebuff(pc),A1
  284.     move.l    $63A6,(A1)+
  285.     move.l    $47AE8,(A1)+
  286.     move.l    $47ADC,(A1)+
  287.     move.l    $47AE0,(A1)+
  288.     lea    SaveGameHD(pc),A0
  289.     JSRGEN    SetExitRoutine        ; SaveGameHD called on exit to write on HD
  290.     moveq    #$10,D0
  291.     movem.l    (sp)+,D1-A6
  292.     rts
  293.  
  294. LoadGame_V3:
  295.     movem.l    D1-A6,-(sp)
  296.     lea    savebuff(pc),A1
  297.     cmp.l    #'FUCK',(A1)        ; valid save data?
  298.     beq    err$
  299.  
  300.     move.l    (A1)+,$47AE4
  301.     move.l    (A1)+,$47AE8
  302.     move.l    (A1)+,$47ADC
  303.     move.l    (A1)+,$47AE0
  304.     moveq    #$10,D0
  305.  
  306.     move.l    #1,$470AE
  307.  
  308.     movem.l    (sp)+,D1-A6
  309.     rts
  310.  
  311. err$
  312.     moveq    #$0,D0
  313.     movem.l    (sp)+,D1-A6
  314.     rts
  315.  
  316.  
  317.  
  318.  
  319.  
  320. SaveGame_V1:
  321.     movem.l    D1-A6,-(sp)
  322.     lea    savebuff(pc),A1
  323.     move.l    $47AB8,(A1)+
  324.     move.l    $47B10,(A1)+
  325.     move.l    $47B04,(A1)+
  326.     move.l    $47B08,(A1)+
  327.     lea    SaveGameHD(pc),A0
  328.     JSRGEN    SetExitRoutine
  329.     moveq    #$10,D0
  330.     movem.l    (sp)+,D1-A6
  331.     rts
  332.  
  333. LoadGame_V1:
  334.     movem.l    D1-A6,-(sp)
  335.     lea    savebuff(pc),A1
  336.     cmp.l    #'FUCK',(A1)
  337.     beq    err$
  338.  
  339.     move.l    (A1)+,$47B0C
  340.     move.l    (A1)+,$47B10
  341.     move.l    (A1)+,$47B04
  342.     move.l    (A1)+,$47B08
  343.     moveq    #$10,D0
  344.  
  345.     move.l    #1,$470D6
  346.  
  347.     movem.l    (sp)+,D1-A6
  348.     rts
  349.  
  350. err$
  351.     moveq    #$0,D0
  352.     movem.l    (sp)+,D1-A6
  353.     rts
  354.  
  355. SaveGame_V2:
  356.     movem.l    D1-A6,-(sp)
  357.     lea    savebuff(pc),A1
  358.     move.l    $63A6.W,(A1)+        ; level
  359.     move.l    $47A38,(A1)+        ; max energy
  360.     move.l    $47A2C,(A1)+        ; minutes left
  361.     move.l    $47A30,(A1)+        ; milli-minutes???
  362.     lea    SaveGameHD(pc),A0
  363.     JSRGEN    SetExitRoutine
  364.     moveq    #$10,D0
  365.     movem.l    (sp)+,D1-A6
  366.     rts
  367.  
  368. LoadGame_V2:
  369.     movem.l    D1-A6,-(sp)
  370.     lea    savebuff(pc),A1
  371.     cmp.l    #'FUCK',(A1)
  372.     beq    err$
  373.  
  374.     move.l    (A1)+,$47A34
  375.     move.l    (A1)+,$47A38
  376.     move.l    (A1)+,$47A2C
  377.     move.l    (A1)+,$47A30
  378.     moveq    #$10,D0
  379.  
  380.     move.l    #1,$46FFE    ; tell the game not to reset life/time
  381.     movem.l    (sp)+,D1-A6
  382.     rts
  383.  
  384. err$
  385.     moveq    #$0,D0
  386.     movem.l    (sp)+,D1-A6
  387.     rts
  388.  
  389. GetExtMem:
  390.     move.l    ExtBase(pc),A0
  391.     rts
  392.  
  393. ; A1=buffer, D0=begtrack, D1=length in tracks
  394.  
  395. ReadTracks:
  396.     STORE_REGS
  397.     move.l    A1,A0    ; destination buffer
  398.  
  399.     subq.l    #1,D0    ; always >=1
  400.     bcs exit$    ; impossible ??
  401.     
  402.     and.w    #$FFFF,D1
  403.     mulu.w    #$C,D1
  404.     lsl.l    #8,D1
  405.     add.l    D1,D1    ; * $1800 = length
  406.  
  407.     and.w    #$FFFF,D0
  408.     mulu.w    #$C,D0
  409.     lsl.l    #8,D0
  410.     add.l    D0,D0    ; * $1800 = offset
  411.  
  412.     move.l    D0,D2
  413.     moveq.l    #0,D0
  414.     JSRGEN    ReadDiskPart
  415.  
  416. exit$
  417.     moveq.l    #-1,D0
  418.     tst.l    D0
  419.     RESTORE_REGS
  420.     rts
  421.  
  422.  
  423. checkversion:
  424.     moveq.l    #0,D0
  425.     moveq.l    #4,D2
  426.     moveq.l    #4,D1
  427.     lea    verbuff(pc),A0
  428.     JSRGEN    ReadDiskPart    ; read only 4 bytes to check the version
  429.     move.l    (A0),D0
  430.  
  431.     cmp.l    #$FFFF,D0
  432.     bne    notv2$
  433.     RELOC_MOVEL    #2,version
  434.     rts
  435. notv2$
  436.     cmp.l    #0,D0
  437.     bne    notv1$
  438.     RELOC_MOVEL    #1,version
  439.     rts
  440.  
  441. notv1$
  442.     cmp.l    #3,D0
  443.     bne    VerErr
  444.     RELOC_MOVEL    #3,version
  445.     rts
  446.     
  447.  
  448.  
  449.  
  450. LoadGameHD:
  451.     RELOC_MOVEL    #'FUCK',savebuff    ; invalidate file
  452.  
  453.     
  454.     lea    savename(pc),A0
  455.     lea    savebuff(pc),A1
  456.     move.l    #$10,D1
  457.     moveq.l    #0,D0
  458.     JSRGEN    ReadUserFileHD
  459.     tst.l    D0
  460.     beq    exit$
  461.     Mac_printf    "** Savegame file not found"
  462. exit$
  463.     rts
  464.  
  465. ; called when the OS is active to save the scores if SAVE was
  466. ; pressed (CTRL-G)
  467.  
  468. SaveGameHD:
  469.     lea    savename(pc),A0
  470.     lea    savebuff(pc),A1
  471.     move.l    #$10,D1
  472.     moveq.l    #0,D0
  473.     JSRGEN    WriteUserFileHD
  474.     tst.l    D0
  475.     beq    exit$
  476.     Mac_printf    "   Can't create save game file"
  477.     Mac_printf    "** Press RETURN to exit"
  478.     JMPABS    WaitReturn
  479. exit$
  480.     rts
  481.  
  482.  
  483. VerErr:
  484.     Mac_printf    "** Unsupported version. Please contact the author"
  485.     JMPABS    CloseAll
  486.  
  487. MemErr:
  488.     Mac_printf    "** Not enough memory!"
  489.     JMPABS    CloseAll
  490.  
  491.  
  492. trainer:
  493.     dc.l    0
  494. ExtBase:
  495.     dc.l    0
  496. version:
  497.     dc.l    0
  498. savebuff:
  499.     blk.l    4,0
  500.  
  501.     ; name for the save game file
  502.  
  503. savename:
  504.     dc.b    "PRINCE.SAV",0
  505.     cnop    0,4
  506.  
  507.     ; space for version buffer (4 bytes+4 safety bytes)
  508.  
  509. verbuff:
  510.     dc.l    0,0
  511.